home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene Storm
/
Scene Storm - Volume 1.iso
/
coding
/
asm
/
utils
/
echo
/
echo.asm
< prev
Wrap
Assembly Source File
|
1980-01-03
|
11KB
|
353 lines
;link +
;
; -Title:
; Echo v1.01
;
; -Purpose:
; To Echo
;
; -Author:
; Tomi Marin, Supervisor Software
;
; -Copyright:
; Copyright © 1989 by Supervisor Software
;
; -Bugs:
;
;
; -Usage:
; ECH [b#] [p#] [r] [v#d] [v#i]
;
; -Modification history:
; 17.09.89 by TM -> v0.00 - created
; 19.09.89 by TM -> v1.00 - a working version
; 21.09.89 by JM,TM -> v1.00.1 - kommentoitu suomeksi
; 23.09.89 by JM -> v1.01 - small modifications
;
include "relative.i"
include "jmplibs.i"
include "gfxlib.i"
include "execlib.i"
include "doslib.i"
include "strlib.i"
include "mathlib.i"
include "numlib.i"
include "macros.i"
include "util.i"
include "hards.i"
include "constants.i"
include "dos.xref"
include "exec.xref"
RELATIVE set -1 käytetään suhteellista osoitusta
BUF equ 5000 viivepuskurin oletuspituus
PER equ 200 näytteenottotaajuuden oletusarvo
VOL equ 64 voimakkuuden oletusarvo
.var
dl _DosBase,cmdlin varataan muuttujille tilaa pinosta
dl exitcode,buflen,buffer
dl tables,tablea
dw periot,repeti,vola,volb
main .begin itse tilan varaus (LINK-käsky)
ra nollataan muuttujat
clr.b -1(a0,d0.l) lisätään nolla komentorivin loppuun
move.l a0,cmdlin(a4) talletetaan komentorivin osoitin
moveq #20,d0
move.l d0,exitcode(a4) asetetaan virhekoodi
openlib Dos,clean avataan Dos-kirjasto
move.l #512,d0 varataan 512 tavua muistia
moveq #1,d1
lib Exec,AllocMem
move.l d0,tables(a4) muistin alkuosoite talteen
beq clean jos muistia ei saatu, poistutaan
move.l tables(a4),a0 kopioidaan alkuosoite
move.l a0,tablea(a4)
move.l #BUF,buflen(a4) puskurin pituuden oletusarvo
move.w #PER,periot(a4) näytteenottotaajuuden oletusarvo
moveq #VOL,d0 äänenvoimakkuuden oletusarvo
move.w d0,vola(a4)
move.w d0,volb(a4)
move.l cmdlin(a4),a0 otetaan komentorivin osoite
parse1 move.b (a0)+,d0 merkki komentoriviltä
beq parse0 nolla -> rivin loppu -> pois
cmp.b #32,d0 jos välilyönti,
beq.s parse1 otetaan seuraava merkki
cmp.b #9,d0 jos tabulaattori,
beq.s parse1 otetaan seuraava merkki
cmp.b #'b',d0 onko 'b' (puskurin koko)?
bne.s parse2 ei -> hyppää
bsr get10 otetaan 10-järjestelmän luku
bcs badargs rivi loppui -> virheilmoitus
move.l d0,buflen(a4) talletetaan puskurin koko
bra parse1 jatketaan rivin käsittelyä
parse2 cmp.b #'p',d0 onko 'p' (näytt.ottonop.)?
bne.s parse3 ei -> hyppää
bsr get10 otetaan 10-järjestelmän luku
bcs badargs rivi loppui -> virheilmoitus
move.w d0,periot(a4) talletetaan nopeus
bra parse1 jatketaan rivin käsittelyä
parse3 cmp.b #'r',d0 onko 'r' (toistuva kaiku)?
bne.s parse4 ei -> hyppää
st repeti(a4) asetetaan lippu: toistuva
bra parse1 jatketaan rivin käsittelyä
parse4 cmp.b #'v',d0 onko 'v' (voimakkuus)?
bne.s parse5 ei -> hyppää
bsr get10 otetaan 10-järjestelmän luku
bcs badargs rivi loppui -> virheilmoitus
move.b (a0)+,d1 seuraava merkki (pitäisi olla d tai i)
cmp.b #'d',d1 onkos 'd'?
bne.s 1$ eipä ole -> hyppele!
move.w d0,vola(a4) on -> tallenna suoran äänen voim.
bra parse1 jatka rivin käsittelyä
1$ cmp.b #'i',d1 onkos se sitten 'i'?
bne.s 2$ ei -> hyppää taas
move.w d0,volb(a4) on -> tallenna viivästetyn äänen voim.
bra parse1 jatka rivin käsittelyä
2$ lea 3$(pc),a0 virheilmoituksen osoite a0:aan
bsr dpymsg tulostetaan virheilmoitus
bra clean pois ohjelmasta!
3$ dc.b 'use vNNd / vNNi',LF,0
ds.w 0 tasataan parilliseen osoitteeseen
parse5 lea 1$(pc),a0 virheilmoituksen osoite
bsr dpymsg tulostetaan se
bra clean ja poistutaan koko roskasta
1$ dc.b 'Bad option "%lc"',LF,0
ds.w 0 tasataan taas parilliseen osoitteeseen
parse0 move.l buflen(a4),d0 puskurin koko
move.l #MEMF_CLEAR!MEMF_PUBLIC,d1
lib Exec,AllocMem varataan kaikupuskuri
move.l d0,buffer(a4) tallennetaan alkuosoite
bne.s main1 jos muistia saatiin -> main1
move.l buflen(a4),d0 jos ei saatu, valitetaan:
lea 1$(pc),a0 virheilmoituksen osoite
bsr dpymsg tulostetaan
bra clean ja pian pois täältä!
1$ dc.b 'Can''t get %ld bytes.',LF,0
ds.w 0 ja taas tasataan
main1 move.l tablea(a4),a0 aputaulukon osoite
moveq #0,d0
1$ move.w d0,d1 lasketaan taulukkoon luvut
mulu.w #$101,d1 $0000, $0101, $0202,...$ffff
move.w d1,(a0)+ luku talteen
addq.w #1,d0 seuraava nummero
cmp.w #$100,d0 jokos lopetetaan?
blo.s 1$ ei -> hyppää
lib Exec,Disable Nyt loppui moniajo!!
clr.b $bfe301 rinnakkaisportti sisäänmenoksi
lea $dff000,a6 apuprosessorien osoite
move.w vola(a4),AUD0VOL(a6) kanavan 0 voimakkuus
move.w vola(a4),AUD1VOL(a6) kanavan 1 voimakkuus
move.w volb(a4),AUD2VOL(a6) kanavan 2 voimakkuus
move.w volb(a4),AUD3VOL(a6) kanavan 3 voimakkuus
move.w periot(a4),d0
move.w d0,AUD0PER(a6) kanavan 0 toistonopeus
move.w d0,AUD1PER(a6) kanavan 1 toistonopeus
move.w d0,AUD2PER(a6) kanavan 2 toistonopeus
move.w d0,AUD3PER(a6) kanavan 3 toistonopeus
move.w #%1000000000001111,DMACON(a6) DMA päälle
move.w #%0000000000001111,DMACON(a6) DMA pois
move.w #%0000011110000000,INTENA(a6) äänikesk. pois
move.l buffer(a4),a2 kaikupuskurin osoite
move.l a2,a0 a0 = luku-kirjoitusosoitin
move.l a2,d6 d6 = kaikupuskurin alkuosoite
move.l a2,d7
add.l buflen(a4),d7 d7 = kaikupuskurin loppuosoite
lea $bfe101,a2 a2 = rinnakkaisportin osoite
move.l tablea(a4),a3 a3 = aputaulukon osoite
tst.w repeti(a4) toistuva kaiku valittu?
beq.s main3 ei, hyppää main3:een
main2 move.w INTREQR(a6),d0 joko entinen näyte on soinut?
and.w #%0000000010000000,d0 vahditaan kanavaa 0
beq.s main2b hyppää, jos pitää odottaa vielä
move.w #$f0f,COLOR0(a6) muuten väläyttää näytön taustaa
bra.s main2c ja jatkaa kiireesti
main2b move.w INTREQR(a6),d0 varsinainen odotussilmukka
and.w #%0000000010000000,d0
beq.s main2b
main2c move.w #%0000011110000000,INTREQ(a6) nollataan keskeytys
moveq #0,d2
move.b (a2),d0 otetaan digitoijalta näyte
sub.b #$80,d0 muunnetaan välille -128...+127
move.b d0,d2 kopio talteen
add.w d2,d2 kerrotaan 2:lla
move.w 0(a3,d2.w),d2
move.w d2,AUD0DAT(a6) Paulalle näyte 16-bittisenä
move.w d2,AUD1DAT(a6)
moveq #0,d1
move.b (a0),d1 otetaan viivästetty näyte puskurista
ext.w d0 muunnetaan uusi ja vanha
ext.w d1 16-bittisiksi
add.w d1,d0 ja lasketaan ne yhteen
muls #11,d0 kerrotaan tulos 11:lla
asr.w #4,d0 ja jaetaan 16:lla
move.b d0,(a0)+ sekä talletetaan puskuriin
and.w #$ff,d0
add.w d0,d0 kerrotaan 2:lla
move.w 0(a3,d0.w),d2
move.w d2,AUD2DAT(a6) ja annetaan Paulalle 16-bittisenä
move.w d2,AUD3DAT(a6)
cmp.l d7,a0 puskurin loppuosoite?
blo.s 1$ ei -> hyppää
move.l d6,a0 on -> siirrytään takaisin alkuun
1$ btst #6,-$100(a2) vasen hiiren nappi?
bne.s main2 ei oo -> jatkuu!
bra.s exitti on -> männään pois!
main3 move.w INTREQR(a6),d0 onko entinen näyte jo soinut?
and.w #%0000000010000000,d0
beq.s main3b ei, ->
move.w #$f0f,COLOR0(a6) on, näytön tausta sinipunaiseksi
bra.s main3c ja jatka
main3b move.w INTREQR(a6),d0 odota näytteen loppua
and.w #%0000000010000000,d0
beq.s main3b
main3c move.w #%0000011110000000,INTREQ(a6) nollataan keskeytys
moveq #0,d2
move.b (a2),d0 lue uusi näyte digitoijalta
sub.b #$80,d0 muunnetaan välille -128..127
move.b d0,d2
add.w d2,d2 taulukon indeksi
move.w 0(a3,d2.w),d2
move.w d2,AUD0DAT(a6) lue taulukosta ja soita näyte
move.w d2,AUD1DAT(a6)
moveq #0,d1
move.b (a0),d1 lue entinen (kaiutettava) näyte
move.b d0,(a0)+ korvaa se uudella puskuriin
add.w d1,d1
move.w 0(a3,d1.w),d2 lue taulukosta ja kaiuta
move.w d2,AUD2DAT(a6)
move.w d2,AUD3DAT(a6)
cmp.l d7,a0 puskurin loppu?
blo.s 1$
move.l d6,a0 on: takaisin puskurin alkuun
1$ btst #6,-$100(a2) vasen hiiren nappi?
bne.s main3 ei: jatketaan
exitti lib Exec,Enable salli keskeytykset ja moniajo
clr.l exitcode(a4) nollaa virhekoodi: ei virhettä
clean move.l buffer(a4),d0 puskuri varattu?
beq.s clean1
move.l d0,a1 on: vapauta se
move.l buflen(a4),d0
lib Exec,FreeMem
clean1 move.l tables(a4),d0 taulukko varattu?
beq.s clean2
move.l d0,a1 on: vapauta
move.l #512,d0
lib Exec,FreeMem
clean2 closlib Dos sulje Dos
move.l exitcode(a4),d0 palauta mahdollinen virhekoodi
.end pois
; ilmoita 'Bad arguments' ja poistu:
badargs lea 1$(pc),a0 tekstin osoite
bsr.s dpymsg tulosta
bra.s clean
1$ dc.b 'Bad args',LF,0
ds.w 0
; tulosta muotoiltu viesti:
; a0 = muotoilumerkkijono, d0..d7 = mahd. parametrit
dpymsg movem.l d0-d7/a0-a6,-(sp) tallenna rekisterit
move.l #256,d0
moveq #1,d1
lib Exec,AllocMem varaa 256 tavua puskuria
tst.l d0 saatiinko varattua?
beq.s dpymsg0 ei: poistu
move.l d0,a1
move.l d0,a2
movem.l (sp),d0-d1 palauta d0:n ja d1:n arvot
move.l 32(sp),a0 ja a0:n arvo
bsr.s sformat muotoile merkkijono puskuriin
lib Dos,Output minne tulostetaan?
move.l d0,d1
beq.s dpymsg1 ei minnekään: poistu
move.l a2,a0
move.l a0,d2
1$ tst.b (a0)+ etsi merkkijonon loppu
bne.s 1$
subq.w #1,a0 siirry takaisin nollan yli
move.l a0,d3
sub.l d2,d3 vähennä siitä alkuos. -> pituus
flib Dos,Write tulosta merkkijono
dpymsg1 move.l a2,a1
move.l #256,d0
lib Exec,FreeMem vapauta puskuri
dpymsg0 movem.l (sp)+,d0-d7/a0-a6 palauta rekisterit
rts
; muotoile merkkijono:
; a0 = muotoilumerkkijono, a1 = puskuri
; d0..d7 = mahd. parametrit
sformat push a2-a3/a6/d0-d1
lea -32(sp),sp varaa 32 tavua pinosta
move.l a1,a3 a3 = puskurin osoite
move.l sp,a1 a1 = parametrien osoite
movem.l d0-d7,(a1) kirjoita parametrit sinne
lea 1$(pc),a2 a2 = merkki puskuriin -rutiini
lib Exec,RawDoFmt muotoile!
lea.l -1(a3),a1 palauta loppunolla osoite a1:ssä
move.l a1,a0 ja a0:ssa
lea 32(sp),sp vapauta pinomuisti
pull a2-a3/a6/d0-d1
rts
; edellisen rutiini merkin kirjoittamiseksi puskuriin:
; a3 = osoitin puskuriin
; d0 = merkki
1$ move.b d0,(a3)+ kirjoita merkki ja suurenna
rts osoitinta
; lue 10-järjestelmän luku merkkijonosta:
; a0 = merkkijono
get10 move.b (a0),d0 ota merkki
bne.s get10a merkkijonon loppu -> virhe
get10x setc c = 1: virhe
rts
get10a push d1 ei:
moveq #0,d1 nollaa luku
get10b moveq #0,d0
move.b (a0)+,d0 ota seur. merkki
sub.b #'0',d0
blo.s get10z pienempi kuin '0' ->
cmp.b #10,d0
bhs.s get10z suurempi kuin '9' ->
add.l d1,d1 kerro jo saatu luku 10:llä
add.l d1,d0 ja lisää uusi numero
asl.l #2,d1
add.l d0,d1
bra.s get10b ota seur. numero
get10z subq.w #1,a0 siirry takaisin tunnistamatto-
move.l d1,d0 maan merkkin; tulos d1:een
pull d1 c = 0: ei virhettä
rts
libnames käytetyt kirjastonimet
end